package protect.week06;

/**
 * @author thinkpad - 83start
 * @version v1.0
 * @create 2022/10/4 22:30
 * @package protect.week06
 * @description 1185. 一周中的第几天
 * 给你一个日期，请你设计一个算法来判断它是对应一周中的哪一天。
 * <p>
 * 输入为三个整数：day、month 和 year，分别表示日、月、年。
 * <p>
 * 您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。
 * <p>
 * 示例 1：
 * <p>
 * 输入：day = 31, month = 8, year = 2019
 * 输出："Saturday"
 * 示例 2：
 * <p>
 * 输入：day = 18, month = 7, year = 1999
 * 输出："Sunday"
 * 示例 3：
 * <p>
 * 输入：day = 15, month = 8, year = 1993
 * 输出："Sunday"
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/day-of-the-week
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */

public class Ch02_DayOfTheWeek {
    public String dayOfTheWeek(int day, int month, int year) {
        String[] weekDays = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        int[] monthDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        int ans = 4;
        // 计算日期到 1970 年 12月 31日的时间间隔

        // 计算满年的日期
        for (int i = 1971; i < year; i++) {
            // 判断是否是闰年，如果是闰年，则加366，如果不是，则加365
            if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) {
                ans += 366;
            } else {
                ans += 365;
            }
        }
        // 计算多月的时间
        for (int j = 1; j < month; j++) {
            ans += monthDays[j - 1];
            // 判断是否是闰年，如果是闰年则多加一天
            if ( (year % 4 == 0 & year % 100 != 0) || (year % 400 == 0)) {
                if (j ==2){
                    ans += 1;
                }
            }
        }

        ans += day;

        int weekIndex = ans % 7;
        return weekDays[weekIndex];

    }
}
